{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_points = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n",
    "y_points = [1, 2, 3, 1, 4, 5, 6, 4, 7 , 10, 15, 9]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x17c4eaeee10>]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x_points, y_points, 'bo')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# y = mx + b\n",
    "m = 0\n",
    "b = 1\n",
    "y = lambda x : m*x + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_points = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n",
    "x_values = [i for i in range(int(min(x_points))-1, int(max(x_points))+2)]\n",
    "x_values\n",
    "y_values = [y(x) for x in x_values]\n",
    "y_values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_points = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n",
    "int(min(x_points))-1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_line(y, data_points):\n",
    "    x_values = [i for i in range(int(min(data_points))-1, int(max(data_points))+2)]\n",
    "    y_values = [y(x) for x in x_values]\n",
    "    plt.plot(x_values, y_values, 'r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_line(y, x_points)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$m = m - \\alpha \\frac{1}{k} \\sum_{i=1}^{k} (f(x^{i}) - y^{i})$$\n",
    "$$b = b - \\alpha \\frac{1}{k} \\sum_{i=1}^{k} ((f(x^{i}) - y^{i}) * x^{i})$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = .001 # .001, .01, .1, 1 ..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def summation(y, x_points, y_points):\n",
    "    total1 = 0\n",
    "    total2 = 0\n",
    "    \n",
    "    for i in range(1, len(x_points)):\n",
    "        total1 += y(x_points[i]) - y_points[i]\n",
    "        total2 += (y(x_points[i]) - y_points[i]) * x_points[i]\n",
    "        \n",
    "    return total1 / len(x_points), total2 / len(x_points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in range(50):\n",
    "    s1, s2 = summation(y, x_points, y_points)\n",
    "    #print (s1,s2)\n",
    "    m = m - learn * s2\n",
    "    b = b - learn * s1\n",
    "    #print(m,b)\n",
    "    plot_line(y, x_points)\n",
    "    plt.plot(x_points, y_points, 'bo')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7690956510651913"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0870410582634897"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_line(y, x_points)\n",
    "plt.plot(x_points, y_points, 'bo')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "m = 0\n",
    "b = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('chirps.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_points = df['Chirps'].tolist()\n",
    "y_points = df['Temp'].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.plot(x_points, y_points, 'bo')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = .001"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(1000):\n",
    "    s1, s2 = summation(y, x_points, y_points)\n",
    "    m = m - learn * s2\n",
    "    b = b - learn * s1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.plot(x_points, y_points, 'bo')\n",
    "plot_line(y, x_points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "y(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {
   "environment": null,
   "summary": "Learn how to apply gradient descent on a data set",
   "url": "https://anaconda.org/benawad/gradient-descent"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
